﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Telerik.Web.UI;
using br.com.portocs.unidaacademico.repositorio;
using br.com.portocs.unidaacademico.repositorio.config;
using br.com.portocs.unidaacademico.dominio;
using br.com.portocs.unidaacademico.ui.views;


public partial class academico_GradesCadastro : PageView
{
    #region Repositórios e Entidades    

    public RepositorioBase<Disciplina> RepositorioDisciplinas
    {
        get
        {
            if (ViewState["repositorioDisciplinas"] == null)
                throw new Exception("Repositório de Disciplinas não foi inicializado");

            return (RepositorioBase<Disciplina>)ViewState["repositorioDisciplinas"];
        }
        set
        {
            if (ViewState["repositorioDisciplinas"] == null)
                ViewState.Add("repositorioDisciplinas", value);
        }
    }

    public RepositorioBase<Grade> RepositorioGrades
    {
        get
        {
            if (ViewState["repositorioGrades"] == null)
                throw new Exception("Repositório de Grades não foi inicializado");

            return (RepositorioBase<Grade>)ViewState["repositorioGrades"];
        }
        set
        {
            if (ViewState["repositorioGrades"] == null)
                ViewState.Add("repositorioGrades", value);
        }
    }

    public RepositorioBase<Curso> RepositorioCursos
    {
        get
        {
            if (ViewState["repositorioDisciplinas"] == null)
                throw new Exception("Repositório de Cursos não foi inicializado");

            return (RepositorioBase<Curso>)ViewState["repositorioCursos"];
        }
        set
        {
            if (ViewState["repositorioCursos"] == null)
                ViewState.Add("repositorioCursos", value);
        }
    }

    public IList<Disciplina> Disciplinas
    {
        get
        {
            return (IList<Disciplina>)ViewState["disciplinas"];
        }
        set
        {
            if (ViewState["disciplinas"] == null)
                ViewState.Add("disciplinas", value);
        }

    }

    #endregion



    private Grade obj;

    private string AreaId = "cadGrade";
    private string pagAnterior = "Grades.aspx";

    private string subTituloPaginaAlterar = "Alteração de Cadastro";
    private string subTituloPaginaCriar = "Cadastrando novo item...";

    private bool voltarAcaoCriar = true; // após ação do usuario, voltar para pag anterior se acao = criar
    private bool voltarAcaoAlterar = true; // após ação do usuario, voltar para pag anterior se acao = Alterar

    #region Funcionamento do Dock

    private List<DockState> CurrentDockStates
    {
        get
        {
            var _currentDockStates = (List<DockState>)Session["CurrentDockStatesDynamicDocks"];
            if (Object.Equals(_currentDockStates, null))
            {
                _currentDockStates = new List<DockState>();
                Session["CurrentDockStatesDynamicDocks"] = _currentDockStates;
            }
            return _currentDockStates;
        }
        set
        {
            Session["CurrentDockStatesDynamicDocks"] = value;
        }
    }

    private RadDock CreateRadDockFromState(DockState state)
    {
        var dock = new RadDock();
        dock.DockMode = DockMode.Docked;
        dock.ID = string.Format("RadDock{0}", state.UniqueName);
        dock.ApplyState(state);
        dock.Commands.Add(new DockCloseCommand());
        dock.Commands.Add(new DockExpandCollapseCommand());

        return dock;
    }

    #endregion

    //função executada no page load
    private void OutrasFuncoesCarregamento()
    {

        if (recuperarAcaoNaViewState() == "alterar")
        {

        }

        //popular os ddls
        if (!Page.IsPostBack)
        {

        }

    }

    private void criaRepositorios()
    {
        RepositorioCursos = new RepositorioBase<Curso>();
        RepositorioDisciplinas = new RepositorioBase<Disciplina>();
        RepositorioGrades = new RepositorioBase<Grade>();
    }

    private void recuperaDisciplinas()
    {
        Disciplinas = RepositorioDisciplinas.RecuperaTodos();
    }

    private RadDock criaRadDockPorDisciplina(Disciplina disciplina)
    {
        var dock = new RadDock {DockMode = DockMode.Docked, UniqueName = Guid.NewGuid().ToString()};

        dock.ID = string.Format("RadDock{0}", dock.UniqueName);

        dock.Collapsed = true;
        dock.Title = string.Format("({0}) {1} - {2}", disciplina.Id, disciplina.Nome, disciplina.Sigla);
        dock.Text = disciplina.Ementa;
        dock.ToolTip = "Clique e arraste para área desejada";
        dock.ExpandText = "Exibir Ementa da Disciplina";
        


        dock.Width = Unit.Pixel(300);

        dock.Commands.Add(new DockCloseCommand());
        dock.Commands.Add(new DockExpandCollapseCommand());

        return dock;

    }

    //definir propriedades no formulario ( carregamento da pag ) obj => form
    private void CarregarFormulario()
    {
        //TODO: informações do formulario
    }

    //form => obj
    private void setarObjComInformacoesDoFormulario()
    {
        if (recuperarAcaoNaViewState() == "criar")
        {
            //TODO: alterar somente o nome da Classe----------------
            this.obj = new Grade();
            setarObjSessao(obj);
            //---------------------------
        }

        var c = RepositorioCursos.RecuperarPorId(Convert.ToInt32(cmbCursos.SelectedValue));        

        getObjSessao().Curso = c;
        getObjSessao().DataCadastro = DateTime.Now;
        getObjSessao().Descricao = tbDescricao.Text;
        getObjSessao().Ativo = chkAtivo.Checked;

        //  Inclui disciplinas
        setaDisciplinasSelecionadasParaGrade();

    }

    private void setaDisciplinasSelecionadasParaGrade()
    {

        foreach (var dock in rdzDisciplinasNovaGrade.Docks)
        {
            var novaDisciplina = RepositorioDisciplinas.RecuperarPorId(
                Convert.ToInt32(dock.Title.Substring(1, dock.Title.IndexOf(")") - 1)));
            
            novaDisciplina.AdicionaAGrade(getObjSessao());
            getObjSessao().AdicionaDisciplina(novaDisciplina);            
        }
    }

    //validações. se for para prosseguir com a ação do usuário, retornar true
    private bool formularioValidado()
    {
        bool retorno = true;

        if (tbDescricao.Text.Length == 0)
        {
            retorno = false;
            litAviso.Text = "- Por favor, insira uma descrição para Grade.<br />";
        }

        if(cmbCursos.SelectedValue.Equals(string.Empty))
        {
            retorno = false;
            litAviso.Text = "- Por favor, selecione um curso.<br />";
        }



        if (!retorno) litAviso.Text += "*** Nada foi feito.";
        if (retorno) litAviso.Text = "";

        return retorno;
    }




    private void FuncoesPosAcaoCursoeAcaoAlterar()
    {
        litAviso.Text = "Item alterado com sucesso.";
    }

    private void FuncoesPosAcaoCursoeAcaoCriar()
    {
        litAviso.Text = "Item cadastrado com sucesso.";
    }



    #region Não editável

    private long ItemId = 0;


    //retorna objeto
    protected Grade getObjSessao()
    {
        if (obj == null)
        {
            if (ViewState["ItemObj"] != null)
                obj = (Grade)ViewState["ItemObj"];
            else
                CarregarObjeto();
        }
        return this.obj;
    }

    protected void setarObjSessao(Grade objS)
    {
        //ViewState["ItemObj"] = objS;
        obj = objS;
    }

    //setar acao na ViewState
    protected void setarAcaoNaViewState(string acao)
    {
        ViewState["acao"] = acao;

    }
    //recuperar acao na ViewState
    protected string recuperarAcaoNaViewState()
    {
        return ViewState["acao"].ToString();
    }

    //carrega Objeto
    protected void CarregarObjeto()
    {
        if (ItemId > 0)
            this.obj = new br.com.portocs.unidaacademico.repositorio.RepositorioBase<Grade>().RecuperarPorId(ItemId);
        else
            this.obj = new Grade();

        setarObjSessao(this.obj);
    }

    //seta a propriedade do Id
    protected void setaIdQueryString()
    {
        this.ItemId = Request.QueryString["ItemId"] != null ? long.Parse(Request.QueryString["ItemId"]) : 0;
    }

    #endregion


    protected void Page_Init(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            for (int i = 0; i < CurrentDockStates.Count; i++)
            {
                var dock = CreateRadDockFromState(CurrentDockStates[i]);
                
                rdlCadastroGrade.Controls.Add(dock);
                
            }
        }


    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            criaRepositorios();
            recuperaDisciplinas();

            if (Request.QueryString["acao"] != null)
                setarAcaoNaViewState(Request.QueryString["acao"]);

            preencheControleLista(cmbCursos, "Nome", "Id", RepositorioCursos.RecuperaTodos(), "- Selecione um curso -");
        
            foreach (var disciplina in Disciplinas)                            
                rdzDisciplinasDisponiveis.Controls.Add(criaRadDockPorDisciplina(disciplina));                            

            CurrentDockStates = rdlCadastroGrade.GetRegisteredDocksState();

            if(recuperarAcaoNaViewState() == "criarPorCurso")
            {
                if (Request.QueryString["cursoId"].ToString() != null)
                    selecionaCampoValorControleLista(cmbCursos, Request.QueryString["CursoId"].ToString());

                tbDescricao.Focus();

                litSubtituloAcao.Text = subTituloPaginaCriar;
            }
            else if (recuperarAcaoNaViewState() == "criar")
            {
                litSubtituloAcao.Text = subTituloPaginaCriar;
            }
            else
            {
                litSubtituloAcao.Text = subTituloPaginaAlterar;
            }
        }

    }

    protected void rdlCadastroGrade_SaveDockLayout(object sender, DockLayoutEventArgs e)
    {
        foreach (DockState state in CurrentDockStates)
        {
            e.Positions[state.UniqueName] = state.DockZoneID;
            e.Indices[state.UniqueName] = state.Index;
        }

    }

    protected void rdlCadastroGrade_LoadDockLayout(object sender, DockLayoutEventArgs e)
    {
        CurrentDockStates = rdlCadastroGrade.GetRegisteredDocksState();

    }

    protected void btSalvarAlteracoes_Click(object sender, EventArgs e)
    {        
        
        if(formularioValidado())
        {
            setarObjComInformacoesDoFormulario();
            Grade dest = RepositorioGrades.SalvarOuAtualizar(getObjSessao());
            setarObjSessao(dest);

            string acao = recuperarAcaoNaViewState();

            if (acao == "criar")
            {
                FuncoesPosAcaoCursoeAcaoCriar();
                limparObjs();
            }

            else if (acao == "alterar")
            {
                FuncoesPosAcaoCursoeAcaoAlterar();

                if (voltarAcaoAlterar)
                    Response.Redirect(pagAnterior);
            }
        }

        
        
        
    }

    private void limparObjs()
    {
        this.obj = null;
        setarObjSessao(null);

    }
    
}
